package code;


import org.junit.jupiter.api.Test;

import java.util.LinkedList;
import java.util.Stack;

public class reverseNode {
    /**
     * 输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）
     * 示例 1：
     * 输入：head = [1,3,2]
     * 输出：[2,3,1]
     * @param head
     * @return
     */
    public int[] reversePrint(ListNode head) {
        LinkedList<Integer> l = new LinkedList<Integer>();
        ListNode temp = head;
        while (temp != null){
            l.add(temp.val);
            temp = temp.next;
        }
        int size = l.size();
        int[] res = new int[size];
        for (int i = 0; i <= size -1; i++){
            res[i] = l.get(size - 1 - i);
        }
        return res;
    }


    /**
     * 翻转链表
     * @param head
     * @return
     */
    public ListNode reverseList(ListNode head) {
        Stack<ListNode> stack = new Stack<ListNode>();

        ListNode temp = head;
        while(temp != null){
            stack.add(temp);
            temp = temp.next;
        }


//        ListNode listNode=stack.pop();
//        ListNode p=listNode;
//        listNode.next=null;
//        while (!stack.isEmpty()){
//            listNode.next=stack.pop();
//            listNode=listNode.next;
//            listNode.next=null;
//        }
//        return p;




        ListNode res = stack.pop();
        ListNode p = res;
        while(!stack.isEmpty()){
            res.next = stack.pop();
            res = res.next;
        }
        return p;
    }

    /**
     *请实现 copyRandomList 函数，复制一个复杂链表。在复杂链表中，每个节点除了有一个 next 指针指向下一个节点，还有一个 random 指针指向链表中的任意节点或者 null。
     * 输入：head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
     * 输出：[[7,null],[13,0],[11,4],[10,2],[1,0]]
     * @param head
     * @return
     */
//    public RandomNode copyRandomList(RandomNode head) {
//        if (head == null) {
//            return null;
//        }
//        for (Node node = head; node != null; node = node.next.next) {
//            Node nodeNew = new Node(node.val);
//            nodeNew.next = node.next;
//            node.next = nodeNew;
//        }
//        for (Node node = head; node != null; node = node.next.next) {
//            Node nodeNew = node.next;
//            nodeNew.random = (node.random != null) ? node.random.next : null;
//        }
//        Node headNew = head.next;
//        for (Node node = head; node != null; node = node.next) {
//            Node nodeNew = node.next;
//            node.next = node.next.next;
//            nodeNew.next = (nodeNew.next != null) ? nodeNew.next.next : null;
//        }
//        return headNew;
//
//
//    }

















    @Test
    public void test(){
        ListNode head=new ListNode(0);
        ListNode firstNode = new ListNode(3);
        ListNode secondNode = new ListNode(2);
        head.val=1;
        head.next=firstNode;
        firstNode.next = secondNode;

        ListNode ints = reverseList(head);
        System.out.println(ints);
    }
}
